// 我们知道了 条件运算符 就可以掌握ts中的兼容性 以及类型的层级
// 兼容性： 就是可以将一个值赋予给某个值
// 类型层级： 低的层级可以赋予高的层级

// 上面是理论
type R1 = 'abc' extends string ? true : false;
type R2 = 123 extends number ? true : false;
type R3 = true extends boolean ? true : false;

// 下面是实战
let r1:string = 'abc';
let r2:number = 123;

type R7 = string extends String ? true: false;
type R8 = number extends Number ? true: false;
type R9 = object extends Object ? true: false;
type R10 = boolean extends Boolean ? true: false;


let abc:string = 'abc';
let str:String = 'hhhh';
let str1:String = abc;
let obj:Object = {};

type R11 = any extends Object ? true: false;
type R12 = any extends Object ? true: false;
type R13 = never extends unknown ? true: false;
// never是最小类型
// 字面量类型可以赋予给基础类型
// 字面量类型可以赋予给字面量的联合类型
// 基础类型是包装类型的子类型
// any unknown 是最大类型

// never < 字面量 < 字面量联合类型 | 字面量类型 < 基础数据类型 < 包装类型 < Object < any | unknown
type R14 = any extends 1 ? true :  false; // true | false
type R15 = any extends Object ? true :  false; // true | false
type R16 = any extends unknown ? true :  false;  // true
type R17 = unknown extends any ? true :  false; // true
type R18 = any extends 1 ? 1 : 2; // 1|2
// 针对any来说 永远返回的结果是成功和失败的联合类型
type R19 = unknown extends "abc" ? true : false; // false
// {}(字面量也是一个空对象) object（只能赋予对象） Object（万物皆对象）

type R20 = {} extends object ? true :  false;
type R21 = {} extends Object ? true :  false;

type R22 = object extends {} ? true :  false;
type R23 = Object extends {} ? true :  false;

type R24 = Object extends object ? true :  false;
type R25 = object extends Object ? true :  false;

export {}